// import { h } from 'snabbdom'
import vnode from './vnode'

// 编写简化版h函数,函数必须接受三个参数
// 他的重载功能较弱
// 三个参数必须是线面三种情况之一
// h('div',{},'文字')
// h('div',{},[])
// h('div',{},h())
export default function h(sel, data, c) {
  // 检查参数的个数
  if (arguments.length != 3) throw new Error('必须传入3各参数,我是低配')
  // 检查参数c的类型
  if (typeof c === 'string' || typeof c == 'number') {
    // 说明是情况一
    return vnode(sel, data, undefined, c, undefined)
  } else if (Array.isArray(c)) {
    // 说明是情况二
    // 遍历c
    let children = []
    for (let i = 0; i < c.length; i++) {
      // 检查c[i]必须是对象
      if (!(typeof c[i] == 'object' && c[i].hasOwnProperty('sel')))
        throw new Error('传入数组中有项不是h函数')
      // 这里不用执行c[i],因为测试语句已经有了执行
      // 只需要收集就好了
      children.push(c[i])
    }
    // 循环结束,说明children已经收集完毕
    return vnode(sel, data, children, undefined, undefined)
  } else if (typeof c == 'object' && c.hasOwnProoerty('sel')) {
    // 说明是情况三
    let children = [c]
    return vnode(sel, data, children, undefined, undefined)
  } else {
    throw new Error('传入的第三个参数类型不对')
  }
}
